package spring.boot.zk.service;

import org.apache.curator.framework.recipes.locks.InterProcessMutex;
import org.apache.curator.framework.recipes.locks.InterProcessReadWriteLock;
import org.apache.curator.framework.recipes.locks.InterProcessSemaphoreMutex;
import org.apache.zookeeper.CreateMode;

import java.util.List;

public interface ZookeeperService {

    /**
     * 判断节点是否存在
     */
    boolean isExistNode (final String path) ;
    /**
     * 创建节点
     */
    void createNode (CreateMode mode,String path ) ;
    /**
     * 设置节点数据
     */
    void setNodeData (String path, String nodeData) ;
    /**
     * 创建节点
     * 节点类型:  0 持久化节点 1 临时节点 2持久顺序节点 3 临时顺序节点
     *           4  Container 节点    5  持久 TTL 节点    6 持久序号TTL
     */
    void createNodeAndData (Integer mode, String path , String nodeData) ;
    /**
     * 获取节点数据
     */
    String getNodeData (String path) ;
    /**
     * 获取节点下数据
     */
    List<String> getNodeChild (String path) ;
    /**
     * 是否递归删除节点
     */
    void deleteNode (String path,Boolean recursive) ;
    /**
     * 获取读写锁
     */
    InterProcessReadWriteLock getReadWriteLock (String path) ;

    /**
     * "监控整个树上的所有节点
     *  利用Watcher来对节点进行监听操作，但此监听操作只能监听一次
     *  一般情况不推荐使用。 TODO 测试无效
     * @param path
     * @return
     */
    @Deprecated
    String watchPath(String path);

    /**
     * Path Cache 观察ZNode的子节点并缓存状态，如果ZNode的子节点被创建，更新或者删除，那么Path Cache会更新缓存，并且触发事件给注册的监听器。
     * Node Cache 观察ZNode自身，如果ZNode节点本身被创建，更新或者删除，那么Node Cache会更新缓存，并触发事件给注册的监听器。
     * Tree Cache 观察的是ZNode及子节点。
     * @param path
     */
    String pathChildCachePath(String path);

    String nodeCachePath(String path);

    String treeCachePath(String path);

    /**
     * TODO
     *  PathChildrenCache  replace by {@link org.apache.curator.framework.recipes.cache.CuratorCache}
     * @param path
     * @return
     */
    String curatorNodeCachePath(String path);

    /**
     * 不可重入的互斥锁 (不可重入的锁很容易在一些情况导致死锁。)
     *  lock.acquire();
     *  lock.release();
     * @param path
     * @return
     */
    InterProcessSemaphoreMutex lock(String path);

    /**
     * 共享可重入锁
     * @param path
     * @return
     */
    InterProcessMutex mutexLock(String path);

    /**
     * 共享可重入读写锁
     * 读锁和读锁不互斥，只要有写锁就互斥。
     * @param path
     * @return
     */
    InterProcessReadWriteLock readWriteLock(String path);

    /**
     * 计数器
     * @param path
     * @return
     */
    Long counter(String path);

    Long getCounter(String path);
}
